//
//  HMComposeView.swift
//  HMWeiBo
//
//  Created by Apple on 16/8/6.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit
import pop

class HMComposeView: UIView {

    // 开发的时候,也会经常使用.
    var target: UIViewController?
    
    private lazy var composeArray: [HMComposeButton] = [HMComposeButton]()
    
    // 第一步: 重写父类的构造函数
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 第二步: 定义一个添加子类和设置子类控件约束的方法
    private func setupUI(){
        
        // 为了方便外界调用,我们在里边给他一个frame
        self.frame.size = CGSizeMake(kUIScreenWidth, KUIScreenHeight)
        
//        backgroundColor = UIColor.yellowColor()
        addSubview(bgImageView)
        bgImageView.snp_makeConstraints { (make) -> Void in
            make.edges.equalTo(self.snp_edges)
        }
        
        // 添加6个按钮
        addChildButton()
    }
    
    private func addChildButton(){
    
//        let button = HMComposeButton()
//        
//        button.frame = CGRectMake(0, 0, 80, 110)
//        
//        button.setImage(UIImage(named: "tabbar_compose_camera"), forState: UIControlState.Normal)
//        
//        button.setTitle("相册", forState: UIControlState.Normal)
//        
//        addSubview(button)
        
        
        // 循环遍历来添加
        /*
            针对于图片和文字在循环中的使用,我们可以采用2种方式:
                plist
                NSArray
        */
        let maxCol = 3
        let childButtonW:CGFloat = 80
        let childButtonH: CGFloat = 110
        let childMargin: CGFloat = ( kUIScreenWidth - CGFloat(maxCol) * childButtonW ) / CGFloat(maxCol + 1)
        
        // 1. 先来获取数据
        
        // 1.1 bundle的路径
        let path = NSBundle.mainBundle().pathForResource("compose.plist", ofType: nil)!
        // 1.2 读取数据 -- 因为放到bundle里所以都可以强制解包
        let childButtonInfos = NSArray(contentsOfFile: path)!
        
//        for (k,v) in  [String: AnyObject]
        
        // 2. 遍历 -- 不能对可选进行遍历
        for (index,childInfo) in childButtonInfos.enumerate() {
            
            
            // 3. 创建button
            
            let button = HMComposeButton()
            
            // 3.1获取title和图片
            let infoDict = childInfo as! [String: AnyObject]
            let title = infoDict["title"] as? String
            // 之前的讲解是为了大家更好的理解 as! 和 as?
            // as! 就是我们程序员能够确保 这个值就是这样的,就可以
            let imageName = infoDict["icon"] as! String
            
            
            button.setTitle(title, forState: UIControlState.Normal)
            
            button.setImage(UIImage(named: imageName), forState: UIControlState.Normal)
            
            // 设置tag
            button.tag = index
            
            // 添加点击方法
            button.addTarget(self, action: "childButtonClick:", forControlEvents: UIControlEvents.TouchUpInside)
            
            
            // 3.2设置frame
            // 列
            let col = index % maxCol
            // 行
            let row = index / maxCol
            
            let x = childMargin * CGFloat(col + 1) + childButtonW * CGFloat(col)
            
            let y = (childButtonH + childMargin) * CGFloat(row) + KUIScreenHeight
            
            button.frame = CGRectMake(x, y, childButtonW, childButtonH)
            
            
            
            // 4. 添加按钮
            addSubview(button)
            
            
            // 5 给按钮添加动画效果
//            anim(button)
            anim(button, beginTime: CACurrentMediaTime() + Double(index) * 0.025)
            
            // 6.添加到数组里
            composeArray.append(button)
        }
        
        
    }
    
    //MARK:-- 按钮点击方法
    @objc private func childButtonClick(button: HMComposeButton){
        
        
//        print(subviews) 也是可以的,我们模仿 subViews
        
       UIView.animateWithDuration(0.25, animations: { () -> Void in
        
        for subButton in self.composeArray {
            
            // 补间动画
            if subButton == button {
                
                // 变大

                subButton.transform = CGAffineTransformMakeScale(2, 2)
                
            } else {
                
                // 变小
                subButton.transform = CGAffineTransformMakeScale(0.5, 0.5)
            }
            
            // 消失
            subButton.alpha = 0
            
        }
        }) { (_ ) -> Void in
            
            // 动画完成 -- 视图控制器进行跳转
            
            let publish = HMPulishViewController()
            
            let nav = UINavigationController(rootViewController: publish)
            
            self.target?.presentViewController(nav, animated: true, completion: { () -> Void in
                
                self.removeFromSuperview()
                
            })
        }
        
    }
    
    //MARK:-- 给按钮添加动画
    private func anim(button: UIButton,beginTime: CFTimeInterval,isUp: Bool = true){
        
        let start =  CACurrentMediaTime()
        
        let spring = POPSpringAnimation(propertyNamed: kPOPViewCenter)
        
        // 
        if isUp {
            
            spring.toValue = NSValue(CGPoint: CGPointMake(button.center.x, button.center.y - 300))
        } else {
            spring.toValue = NSValue(CGPoint: CGPointMake(button.center.x, button.center.y + 300))
            
        }
        
        
        /*
        1.springBounciness 弹簧弹力 取值范围为[0, 20]，默认值为4
        2.springSpeed 弹簧速度，速度越快，动画时间越短 [0, 20]，默认为12，和springBounciness一起决定着弹簧动画的效果
        3.dynamicsTension 弹簧的张力
        4.dynamicsFriction 弹簧摩擦
        5.dynamicsMass 质量 。张力，摩擦，质量这三者可以从更细的粒度上替代springBounciness和springSpeed控制弹簧动画的效果
        */
        
        spring.springBounciness = 8
        
        spring.springSpeed = 8
        
        // 设置一个开始时间
        // CFTimeInterval
       
        spring.beginTime =  beginTime
        
        button.pop_addAnimation(spring, forKey: nil)
        
        //  CACurrentMediaTime() 这个用于我们测试代码运行的效率
//        print( CACurrentMediaTime() - start)
        
    }
    
    // MARK:-- 按钮消失的方法
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        // 想让数组反向遍历,我们可以用 composeArray.reverse().enumerate()
        for (index,button) in composeArray.reverse().enumerate() {
        
            anim(button, beginTime: CACurrentMediaTime() + 0.025 * Double(index),isUp: false)
            
        }
        
        // 把当前的视图 remove -- 一下就消失了
//        self.removeFromSuperview()
        
//        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//    self.removeFromSuperview()
//})
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64( 1 * NSEC_PER_SEC)), dispatch_get_main_queue()) { () -> Void in
            
            self.removeFromSuperview()
            
        }
        
    }

    
    class func abc(vc: UIViewController) {
        
        // 把 vc 传递过来的控制器赋值给 类属性
    
        // 类方法不能访问对象的属性
        
//        HMComposeView().target = vc
        
        
    }
    
    // 
    class func show(target: UIViewController) {
        
        //类方法可以调用对象属性吗???
        // 不可以调用 对象属性
        HMComposeView().show(target)
        
    }
    
    func show(target: UIViewController){
        // 赋值操作
        self.target = target
        // 把self添加到 target
        self.target?.view.addSubview(self)
    }
    
    //第三步: 懒加载控件
    //MARK:-- 懒加载控件
    private lazy var bgImageView: UIImageView = {
    
//    let img = UIImageView(image: self.getScreeenShot())
        let img = UIImageView(image: UIImage.getScreeenShot())
        // 设置一下毛玻璃的样式
        let effect = UIBlurEffect(style: UIBlurEffectStyle.Light)
        // 毛玻璃 iOS8.0以后可以使用
        let visil = UIVisualEffectView(effect: effect)
        // 把毛玻璃效果添加到图片上
        img.addSubview(visil)
        // 还需要设置 毛玻璃的 约束
        visil.snp_makeConstraints(closure: { (make) -> Void in
             make.edges.equalTo(img.snp_edges)
        })
        return img
    
    }()

}
